/*
 * Copyright 2009-2009 Tanesha Project. All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification, 
 * are permitted provided that the following conditions are met:
 * 
 *    1. Redistributions of source code must retain the above copyright notice, 
 *    	 this list of conditions and the following disclaimer.
 *    2. Redistributions in binary form must reproduce the above copyright notice,
 *    	 this list of conditions and the following disclaimer in the documentation 
 *    	 and/or other materials provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT ``AS IS'' AND ANY EXPRESS OR 
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
 * SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 *  OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 * The views and conclusions contained in the software and documentation are those 
 * of the authors and should not be interpreted as representing official policies, 
 * either expressed or implied, of the Tanesha Project.
 */
package com.google.api.chart;

import java.util.List;

import com.google.api.chart.encoding.SimpleURLEncoding;
import com.google.api.chart.features.GoogleOMeterAndPieLabelsFeature;

/**
 * Implements the QRCode chart.
 * <p>
 * QRCodes creates a QRCode from a label {@link QRCodeChartMaker#label(String...)}, it is possible to specify the margins
 * and error correction settings {@link QRCodeChartMaker#ecH(int)}, {@link QRCodeChartMaker#ecL(int)}
 * {@link QRCodeChartMaker#ecQ(int)}, and {@link QRCodeChartMaker#ecM(int)}. Further
 * the encoding can be specified {@link QRCodeChartMaker#iso88591Encoding()}, {@link QRCodeChartMaker#shiftJISEncoding()}.
 * UTF-8 encoding is the default.
 * </p>
 * <p>
 * Google will automatically select the QRCode version, depending on the length
 * of the label and the error correction setting.
 * </p>
 * @author sorenad
 *
 */
public final class QRCodeChartMaker implements ChartTypeMaker, GoogleOMeterAndPieLabelsFeature<QRCodeChartMaker> {
	
	protected QRCodeChartMaker() {
	}

	private String chl = null;
	private String choe = null;
	private String chld = null;

	@Override
	public void fillParameters(List<String> parameters, List<String> chmParameters) {
		if (chl != null)
			parameters.add("chl=" + chl);
		if (choe != null)
			parameters.add("choe=" + choe);
		if (chld != null)
			parameters.add("chld=" + chld);
	}

	@Override
	public QRCodeChartMaker label(String... labels) {
		if (labels.length > 0)
			this.chl = SimpleURLEncoding.encode(labels[0]);
		return this;
	}
	
	/**
	 * Specify UTF-8 encoding.
	 * @return
	 */
	public QRCodeChartMaker utf8Encoding() {
		this.choe = "UTF-8";
		return this;
	}
	/**
	 * Specify ISO-8859-1 encoding.
	 * @return
	 */
	public QRCodeChartMaker iso88591Encoding() {
		this.choe = "ISO-8859-1";
		return this;
	}
	/**
	 * Specify Shift_JIS encoding.
	 * @return
	 */
	public QRCodeChartMaker shiftJISEncoding() {
		this.choe = "Shift_JIS";
		return this;
	}
	
	/**
	 * Specify error correction "L" (7% errors can be corrected)
	 * @param margin The margin for the QRCode image
	 * @return
	 */
	public QRCodeChartMaker ecL(int margin) {
		this.chld = "L|" + margin;
		return this;
	}
	/**
	 * Specify error correction "M" (15% errors can be corrected)
	 * @param margin The margin for the QRCode image
	 * @return
	 */
	public QRCodeChartMaker ecM(int margin) {
		this.chld = "M|" + margin;
		return this;
	}
	/**
	 * Specify error correction "Q" (25% errors can be corrected)
	 * @param margin The margin for the QRCode image
	 * @return
	 */
	public QRCodeChartMaker ecQ(int margin) {
		this.chld = "Q|" + margin;
		return this;
	}
	/**
	 * Specify error correction "H" (30% errors can be corrected)
	 * @param margin The margin for the QRCode image
	 * @return
	 */
	public QRCodeChartMaker ecH(int margin) {
		this.chld = "H|" + margin;
		return this;
	}

	@Override
	public String toString() {
		return "qr";
	}
}
